#include<iostream>
using namespace std;

#define TEST(func, s, t) { \
    printf("%s(%s %s) = %d\n", #func, s, t, func(s, t)); \
}

char s[100], t[100];
int nxt[100];

int brute_force(const char *s, const char *t) {
    for (int i = 0; s[i]; i++) {
        int flag = 0;
        for (int j = 0; t[j]; j++) {
            if (s[i + j] == t[j]) {
                printf("%c : %c : yes\n",s[i + j], t[j]);
                continue;
            } else {
                printf("%c : %c : no\n", s[j + i], t[j]);
                flag = 1;
                break;
            }
        }
        if (flag == 0) return i;
    }
    return -1;
}

int getNext(char ch, int &j, const char *t) {
    while (j != -1 && t[j + 1] == ch) j = nxt[j];
    if (t[j + 1] == ch) j += 1;
    return j;
}

int kmp(const char *s, const char *t) {
    nxt[0] = -1;
    // j 代表最长的前缀的位置
    for (int i = 1, j = -1; t[i]; i++) {
        // // 如果某一位不相等的话,那么就需要借用这一位前的最长前缀
        // while (j != -1 && t[i] != t[j + 1]) j = nxt[j];
        // // 如果两个字母相等,那么最长前缀肯定是要加一的
        // if (t[i] == t[j + 1]) j += 1;
        // nxt[i] = j;
        nxt[i] = (j = getNext(t[i], j , t));
    }
    // j的值的变化,表示了匹配过程
    for (int i = 1, j = -1; s[i]; i++) {
        while (j != -1 && s[i] != t[j + 1]) j = nxt[j];
        if (s[i] == t[j + 1]) j += 1;
        if (t[j + 1] == 0) return i - j;
    }
    return -1;
}

int main() {
    while (~scanf("%s%s", s, t)) {
        TEST(brute_force, s, t);
        TEST(kmp, s, t);
    }

    return 0;
}